#include <stdio.h>
#include <stdlib.h>

typedef char DataType;
// 声明结点结构
typedef struct node
{
    DataType data;     // 结点数据域
    struct node *next; // 结点指针域(自己本身)
} ListNode;

// 声明一个链表 别名 CircularLinkList (循环链表)
typedef ListNode *CircularLinkList;

// 声明双向链表结构
typedef struct dlnode
{
    DataType data;       // 结点数据域
    struct dlnode *prev; // 上一个结点
    struct dlnode *next; // 下一个结点， 结点指针域(自己本身)
} DLNode;

// 双向循环链表
typedef DLNode *DoublyLinkList;

// 单向循环链表打印
void printCircularList(CircularLinkList p)
{
    printf("\n---------------print circular link list---------------\n");
    CircularLinkList temp = p;
    do
    {
        printf("v=%c\n", temp->data);
        temp = temp->next;
    } while (temp != p);
    printf("---------------end print circular link list---------------\n");
}

void printElements(CircularLinkList p){
    CircularLinkList temp = p;
    printf("cur=[");
    do
    {
        printf(",%c", temp->data);
        temp = temp->next;
    } while (temp != p);
    printf("]\n");
}

// 双向循环链表打印
void printDoublyList(DoublyLinkList p)
{
    printf("\n---------------print doubly link list------------\n");
    DoublyLinkList temp = p;
    do
    {
        printf("v=%c, p=%p\n", temp->data, temp);
        temp = temp->next;
    } while (temp != p);

    printf("++++++++++\n");
    do
    {
        temp = temp->prev;
        printf("v=%c, p=%p\n", temp->data, temp);
    } while (temp != p);
    
    printf("\n---------------end print doubly link list------------\n");
}
